home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / sokoban-.tar / sokoban-src.tar / sokoban / save.c < prev    next >
C/C++ Source or Header  |  1990-10-09  |  4KB  |  104 lines

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <signal.h>
  5. #include "sokoban.h"
  6.  
  7. extern char  *malloc();
  8. extern FILE  *fopen();
  9.  
  10. extern char  *username;
  11. extern char  map[MAXROW+1][MAXCOL+1];
  12. extern short level, moves, pushes, packets, savepack, rows, cols;
  13. extern short scoring;
  14. extern POS   ppos;
  15.  
  16. static int        savedbn;
  17. static char        *sfname;
  18. static FILE        *savefile;
  19. static struct stat sfstat;
  20.  
  21. short savegame() {
  22.  
  23.    short ret = 0;
  24.  
  25.    signal( SIGINT, SIG_IGN);
  26.    sfname = malloc( strlen( SAVEPATH) + strlen( username) + 5);
  27.    sprintf( sfname, "%s/%s.sav", SAVEPATH, username);
  28.    if( (savefile = fopen( sfname, "w")) == NULL)
  29.       ret = E_FOPENSAVE;
  30.    else {
  31.       savedbn = fileno( savefile);
  32.       if( write( savedbn, &(map[0][0]), MAXROW*MAXCOL) != MAXROW*MAXCOL)
  33.      ret = E_WRITESAVE;
  34.       else if( write( savedbn, &ppos, sizeof( POS)) != sizeof( POS))     
  35.      ret = E_WRITESAVE;
  36.       else if( write( savedbn, &scoring, 2) != 2)  ret = E_WRITESAVE;
  37.       else if( write( savedbn, &level, 2) != 2)    ret = E_WRITESAVE;
  38.       else if( write( savedbn, &moves, 2) != 2)    ret = E_WRITESAVE;
  39.       else if( write( savedbn, &pushes, 2) != 2)   ret = E_WRITESAVE;
  40.       else if( write( savedbn, &packets, 2) != 2)  ret = E_WRITESAVE;
  41.       else if( write( savedbn, &savepack, 2) != 2) ret = E_WRITESAVE;
  42.       else if( write( savedbn, &rows, 2) != 2)     ret = E_WRITESAVE;
  43.       else if( write( savedbn, &cols, 2) != 2)     ret = E_WRITESAVE;
  44.       else {
  45.      fclose( savefile);
  46.      if( stat( sfname, &sfstat) != 0) ret = E_STATSAVE;
  47.      else if( (savefile = fopen( sfname, "a")) == NULL)
  48.             ret = E_FOPENSAVE;
  49.          else {
  50.         if( write( savedbn, &sfstat, sizeof( sfstat)) != sizeof( sfstat))
  51.            ret = E_WRITESAVE;
  52.         fclose( savefile);
  53.      }
  54.       }
  55.    }
  56.    if( (ret == E_WRITESAVE) || (ret == E_STATSAVE)) unlink( sfname);
  57.    signal( SIGINT, SIG_DFL);
  58.  
  59.    return( ret);
  60. }
  61.  
  62. short restoregame() {
  63.  
  64.    short ret = 0;
  65.    struct stat oldsfstat;
  66.  
  67.    signal( SIGINT, SIG_IGN);
  68.    sfname = malloc( strlen( SAVEPATH) + strlen( username) + 5);
  69.    sprintf( sfname, "%s/%s.sav", SAVEPATH, username);
  70.    if( stat( sfname, &oldsfstat) < -1) 
  71.       ret = E_NOSAVEFILE;
  72.    else {
  73.       if( (savefile = fopen( sfname, "r")) == NULL)
  74.      ret = E_FOPENSAVE;
  75.       else {
  76.          savedbn = fileno( savefile);
  77.          if( read( savedbn, &(map[0][0]), MAXROW*MAXCOL) != MAXROW*MAXCOL)
  78.         ret = E_READSAVE;
  79.          else if( read( savedbn, &ppos, sizeof( POS)) != sizeof( POS))     
  80.         ret = E_READSAVE;
  81.          else if( read( savedbn, &scoring, 2) != 2)  ret = E_READSAVE;
  82.          else if( read( savedbn, &level, 2) != 2)    ret = E_READSAVE;
  83.          else if( read( savedbn, &moves, 2) != 2)    ret = E_READSAVE;
  84.          else if( read( savedbn, &pushes, 2) != 2)   ret = E_READSAVE;
  85.          else if( read( savedbn, &packets, 2) != 2)  ret = E_READSAVE;
  86.          else if( read( savedbn, &savepack, 2) != 2) ret = E_READSAVE;
  87.          else if( read( savedbn, &rows, 2) != 2)     ret = E_READSAVE;
  88.          else if( read( savedbn, &cols, 2) != 2)     ret = E_READSAVE;
  89.      else if( read( savedbn, &sfstat, sizeof( sfstat)) != sizeof( sfstat))
  90.         ret = E_READSAVE;
  91.      else if( (sfstat.st_dev != oldsfstat.st_dev) ||
  92.                   (sfstat.st_ino != oldsfstat.st_ino) ||
  93.                   (sfstat.st_nlink != oldsfstat.st_nlink) ||
  94.                   (sfstat.st_uid != oldsfstat.st_uid) ||
  95.                   (sfstat.st_gid != oldsfstat.st_gid) ||
  96.                   (sfstat.st_mtime != oldsfstat.st_mtime))
  97.             ret = E_ALTERSAVE;
  98.       }
  99.       unlink( sfname);
  100.    }
  101.    signal( SIGINT, SIG_DFL);
  102.    return( ret);
  103. }
  104.